package ve.socket;

import java.io.*;
import java.net.*;
import java.util.Random;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;

public class Transmisor extends Activity {

	static Socket socket = null;
	static int conectado = 0;
	static BufferedReader in = null;
	static PrintWriter out = null;
	static OutputStream salidaArchivo = null; 
	static String USER = "";
	static String PASS = "";
	static String IP = "";
	static String CARPETA = "";
	static listarDirectorio mDirectoryScanner = null;
	static enviarArchivo enviarArch = null;
	String listo = "";
	boolean iniciado = false;
	
	public static int PUERTO = 16001;


	public static final String PREFS_NAME = "MyPrefsFile";

	/** Se llama cuando la actividad es creada por primera vez. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// Cargo las preferrencias
		cargarPref();

		// Intento conectarme
		Conectar();
		// Voy a la pantalla de inicio
		ini();

	}

	@Override
	protected void onStop() {
		super.onStop();

		guardarPref();
	}

	public void cargarPref() {
		// Restore preferences
		try {
			SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
			USER = settings.getString("user", "Admin");
			PASS = settings.getString("pass", "Admin");
			IP = settings.getString("ip", "192.168.1.8");
			PUERTO = Integer.parseInt(settings.getString("puerto", "16000"));
			CARPETA = settings.getString("carpeta", "Compartido3");
		} catch (NumberFormatException NFE) {
			displayERR("No se han podido cargar las preferencias con exito!!!");
		}
	}

	public void guardarPref() {
		// We need an Editor object to make preference changes.
		// All objects are from android.context.Context
		SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
		SharedPreferences.Editor editor = settings.edit();

		editor.putString("user", USER);
		editor.putString("pass", PASS);
		editor.putString("ip", IP);
		editor.putString("puerto", "" + PUERTO);
		editor.putString("carpeta", CARPETA);

		// Commit the edits!
		editor.commit();
	}

	public void ini() {

		setContentView(R.layout.ini);
		final Button opcionesIni = (Button) findViewById(R.id.Opciones);
		final Button TerminalIni = (Button) findViewById(R.id.PantallaEstado);
		final Button SalirIni = (Button) findViewById(R.id.Salir);

		opcionesIni.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				Opciones();
			}
		});

		TerminalIni.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				Terminal();
			}
		});

		SalirIni.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				Salir();
			}
		});

	}

	public void Opciones() {

		setContentView(R.layout.opciones);
		final Button AtrasOpciones = (Button) findViewById(R.id.Atras);
		final Button SalirOpciones = (Button) findViewById(R.id.Salir);
		final EditText textIP = (EditText) findViewById(R.id.ip);
		final EditText textPuerto = (EditText) findViewById(R.id.puerto);
		final EditText textUser = (EditText) findViewById(R.id.usuario);
		final EditText textPass = (EditText) findViewById(R.id.contras);
		final EditText textCarp = (EditText) findViewById(R.id.carpeta);
		final Button guardarOpciones = (Button) findViewById(R.id.Guardar);

		textIP.setText(IP);
		textPuerto.setText("" + PUERTO);
		textUser.setText(USER);
		textPass.setText(PASS);
		textCarp.setText(CARPETA);
		
		AtrasOpciones.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				ini();
			}
		});

		guardarOpciones.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				Guardar();
			}
		});

		SalirOpciones.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				Salir();
			}
		});
	}

	// Aqui lo que se hace es que se guarda en las propiedades locales
	// las configuraciones para que esten disponibles para la proxima vez
	// que se necesiten
	// Ver http://developer.android.com/guide/topics/data/data-storage.html#pref
	public void Guardar() {
		final EditText ip = (EditText) findViewById(R.id.ip);
		final EditText puerto = (EditText) findViewById(R.id.puerto);
		final EditText user = (EditText) findViewById(R.id.usuario);
		final EditText pass = (EditText) findViewById(R.id.contras);
		final EditText dirCarp = (EditText) findViewById(R.id.carpeta);
		
		try {
			IP = ip.getText().toString().trim();
			PUERTO = Integer.parseInt(puerto.getText().toString().trim());
			USER = user.getText().toString().trim();
			PASS = pass.getText().toString().trim();
			CARPETA = dirCarp.getText().toString().trim();
			
			if (IP.length() < 7 || USER.length() == 0 || PASS.length() == 0 || CARPETA.length() == 0)
				displayERR("No se han podido guardar las opciones, chequee los datos.");

			// Si todo va bien se retorna al inicio.
			else {
				guardarPref();
				ini();
			}

		} catch (NumberFormatException NFE) {
			displayERR("Error En el campo Puerto");
		}
	}

	public void Terminal() {

		setContentView(R.layout.main);

		final Button Start = (Button) findViewById(R.id.Start);
		final Button ConectarTerminal = (Button) findViewById(R.id.Conectar);
		final Button Stop = (Button) findViewById(R.id.Stop);
		final Button AtrasTerminal = (Button) findViewById(R.id.Atras);
		final EditText ipField = (EditText) findViewById(R.id.ip);
		final EditText puertoField = (EditText) findViewById(R.id.puerto);

		// OJO ESTO SE QUITA
		// SimularTerminal.setEnabled(false);

		// Si ya nos conectamos se inhabilita la posibilidad de conexion
		if (conectado != 0) {
			ipField.setText(IP);
			puertoField.setText("" + PUERTO);
			ipField.setEnabled(false);
			puertoField.setEnabled(false);
			ConectarTerminal.setEnabled(false);
		} else {
			Start.setEnabled(false);
		}

		Start.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				try {
					final Button Stop = (Button) findViewById(R.id.Stop);
					final Button Start = (Button) findViewById(R.id.Start);
					Start.setEnabled(false);
					Stop.setEnabled(true);
					Start();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});

		ConectarTerminal.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				Conectar2();
			}
		});

		Stop.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				try {
					final Button Start = (Button) findViewById(R.id.Start);
					final Button Stop = (Button) findViewById(R.id.Start);
					Stop.setEnabled(false);
					Start.setEnabled(true);
					Stop();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});

		AtrasTerminal.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				ini();
			}
		});

	}

	// Se encarga de realizar la conexion con el socket
	// y de establecer la autenticación con el Servidor
	public void Conectar() {
		String Respuesta = "";


		try {
			InetAddress addr = InetAddress.getByName(IP);
			// Instanciamos el Socket, el in y el out
			socket = new Socket(addr, PUERTO);
			in = new BufferedReader(new InputStreamReader(
					socket.getInputStream()));
			salidaArchivo = socket.getOutputStream();
			out = new PrintWriter(salidaArchivo, true);
			conectado = 1;

			// Enviamos el user y el pass
			if (!socket.isClosed()) {
				out.println(USER + " " + PASS);
				try {
					// Leo La respuesta de Acom
					Respuesta = in.readLine().replace(";", "\n");

					if (Respuesta.equals("Permiso Denegado")) {
						// Si la autenticacion no pasa se cierra el socket
						cerrarSocket();
					}
				} catch (IOException e) {

				}
			}

		} catch (UnknownHostException e) {
			displayERR("Error de Host Desconocido");
		} catch (IOException io) {

		}

		// Falta Autenticar por user y pass
	}

	//Conectar2() Es para conectarse desde el terminal y Conectar() es para conectarse a penas abre la aplicacion
	public void Conectar2() {

		final EditText ipField = (EditText) findViewById(R.id.ip);
		final EditText puertoField = (EditText) findViewById(R.id.puerto);
		final Button Enviar = (Button) findViewById(R.id.Start);
		final Button Conectar = (Button) findViewById(R.id.Conectar);
		final TextView terminal = (TextView) findViewById(R.id.terminal);
		final ScrollView scroll = (ScrollView) findViewById(R.id.S);

		int p = 0;
		String ip = ipField.getText().toString().trim();
		String pp = puertoField.getText().toString().trim();
		String Respuesta = "";

		if (ip.length() > 7 && pp.length() > 0) {

			try {

				p = Integer.parseInt(pp);
				InetAddress addr = InetAddress.getByName(ip);
				// Instanciamos el Socket, el in y el out

				socket = new Socket(addr, p);
				in = new BufferedReader(new InputStreamReader(
						socket.getInputStream()));
				salidaArchivo = socket.getOutputStream();
				out = new PrintWriter(salidaArchivo, true);
				conectado = 1;

				ipField.setText("");//ip);
				puertoField.setText("" + p);
				ipField.setEnabled(false);
				puertoField.setEnabled(false);
				Enviar.setEnabled(true);
				Conectar.setEnabled(false);

				// Enviamos el user y el pass
				if (!socket.isClosed()) {
					out.println(USER + " " + PASS);
					try {
						// Leo La respuesta de Acom
						terminal.append(">> Autenticando" + USER + " " + PASS
								+ ":\n");
						scroll.setFocusable(true);
						scroll.scrollBy(0, 12 * (terminal.getLineCount() + 1));

						Respuesta = in.readLine().replace(";", "\n");
						terminal.append(">> " + Respuesta + "\n");
						scroll.setFocusable(true);
						scroll.scrollBy(0, 12 * (terminal.getLineCount() + 1));

						if (Respuesta.equals("Permiso Denegado")) {
							// Si la autenticacion no pasa se cierra el socket
							Conectar.setEnabled(true);
							puertoField.setEnabled(true);
							Enviar.setEnabled(false);
							cerrarSocket();
						}
					} catch (IOException e) {

					}
				}

			} catch (UnknownHostException e) {
				displayERR("Error de Host Desconocido");
			} catch (Exception io) {

			}
		}

	}


	// Simula la recepcion de datos
	public void Start() throws IOException {

		final TextView terminal = (TextView) findViewById(R.id.terminal);
		final ScrollView scroll = (ScrollView) findViewById(R.id.S);
		final Button stop = (Button) findViewById(R.id.Stop);
		final Button start = (Button) findViewById(R.id.Start);
		

		String mSdCardPath = android.os.Environment
		.getExternalStorageDirectory().getAbsolutePath() + "/"+CARPETA;

		File currentDirectory = new File(mSdCardPath); 

		Log.v("Transmisor: ", "Path: " + mSdCardPath);

		if (!iniciado){
		mDirectoryScanner = new listarDirectorio (currentDirectory);
		enviarArch = new enviarArchivo();
		iniciado = true;
		}
		//Iniciamos hilo que encola los archivos a ser enviados
		mDirectoryScanner.start();
		enviarArch.start();
		enviarArch.stop = false;
		stop.setEnabled(true);
		start.setEnabled(false);

	}

	// Genera un numero valido entre 1 e i
	public int numValido(int i) {
		int x = 0;
		Random rand = new Random();

		do {
			x = rand.nextInt(i);
		} while (x == 0);

		return x;
	}

	// Se encarga de Verificar que al salir no se deje el socket abierto
	public static void Salir() {
		// Si nos habiamos conectado debemos cerrar la conexion del
		// socket y salir.
		if (conectado != 0) {
			cerrarSocketYSalir();
			// si no solo cerramos la aplicacion.
		} else
			System.exit(0);
	}

	// Si hay un socket abierto lo cierra para poder salir con Éxito.
	public static void cerrarSocket() {
		try {
			salidaArchivo.close();
			out.close();
			in.close();
			socket.close();
		} catch (IOException e) {
			//final TextView terminal = (TextView) findViewById(R.id.terminal);
			//terminal.append("**ERROR** no se puede cerrar la conexion.");
		}
	}

	// Si hay un socket abierto lo cierra para poder salir con Éxito.
	public static void cerrarSocketYSalir() {
		cerrarSocket();
		System.exit(0);
	}

	// Debe sacar un error con un popup
	public void displayERR(String err) {

	}

	// Se ejecuta al presionar el botón de stop.
    public static void Stop(){
    	
    	mDirectoryScanner.Stop();
    	enviarArchivo.Stop();
    	
        if(mDirectoryScanner!=null && mDirectoryScanner.isAlive())
        	mDirectoryScanner.interrupt();
    }

 // Este handler se encarga de Imprimir en la pantalla los datos del archivo
    Handler progressHandler = new Handler() {
        public void handleMessage(Message msg) {
        	
        	final TextView terminal = (TextView) findViewById(R.id.terminal);
        	final ScrollView scroll = (ScrollView) findViewById(R.id.S);
        	// Se adjunta todo a la consola
        	terminal.append(listo + "\n");
        	scroll.setFocusable(true);
        	scroll.scrollBy(0, 12 * (terminal.getLineCount() + 1));
        	
        }
    };


}
